#include <iostream>
#include <vector>
using namespace std;

class Add
{
public:
    int operator()(int a, int b)
    {
        return  a + b;
    }
};

void test(int a, int b, const function<int(int, int)> &func)
{
    cout<<"add ="<<func(a, b)<<endl;
}

int add(int a, int b)
{
    return a + b;
}

int main(int argc, char ** argv)
{
    //匿名对象
    auto p_add = [](int a, int b){return a + b};
    //函数指针
    using P_FUNC = int (*)(int, int);
    P_FUNC p_func = add;

    Add a;

    cout<<add(1,2)<<endl;
    cout<<a(1,2)<<endl;
    cout<<p_func(1,2)<<endl;
    cout<<p_add(1,2)<<endl;

    test(1,2,add);
    test(1,2,p_func);
    test(1,2,a);
    test(1,2,p_add);

    function<int(int, int)> f1(add);
    function<int(int, int)> f1(a);
    function<int(int, int)> f1(p_func);
    function<int(int, int)> f1(p_add);

}